From 57f0d6a21f61616acef6589eb47e518ce85ab40e Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 4 Jul 2004 20:35:35 +0000 Subject: [PATCH] Add a simple file browser based on the icon view. 2004-07-04 Anders Carlsson * demos/gtk-demo/Makefile.am: * demos/gtk-demo/gnome-fs-directory.png: * demos/gtk-demo/gnome-fs-regular.png: * demos/gtk-demo/iconview.c: (load_pixbufs), (fill_store), (sort_func), (create_store), (item_activated), (up_clicked), (home_clicked), (do_iconview): Add a simple file browser based on the icon view. * gtk/gtk.h: Add gtk/gtkiconview.h * gtk/gtkiconview.c: (gtk_icon_view_layout), (gtk_icon_view_item_new), (gtk_icon_view_item_activated): Fix a few bugs discovered while writing the demo. --- ChangeLog | 17 ++ ChangeLog.pre-2-10 | 17 ++ ChangeLog.pre-2-6 | 17 ++ ChangeLog.pre-2-8 | 17 ++ demos/gtk-demo/Makefile.am | 5 +- demos/gtk-demo/gnome-fs-directory.png | Bin 0 -> 2044 bytes demos/gtk-demo/gnome-fs-regular.png | Bin 0 -> 1795 bytes demos/gtk-demo/iconview.c | 358 ++++++++++++++++++++++++++ gtk/gtk.h | 1 + gtk/gtkiconview.c | 19 +- 10 files changed, 446 insertions(+), 5 deletions(-) create mode 100644 demos/gtk-demo/gnome-fs-directory.png create mode 100644 demos/gtk-demo/gnome-fs-regular.png create mode 100644 demos/gtk-demo/iconview.c diff --git a/ChangeLog b/ChangeLog index 68a94576a3..e255059074 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-07-04 Anders Carlsson + + * demos/gtk-demo/Makefile.am: + * demos/gtk-demo/gnome-fs-directory.png: + * demos/gtk-demo/gnome-fs-regular.png: + * demos/gtk-demo/iconview.c: (load_pixbufs), (fill_store), + (sort_func), (create_store), (item_activated), (up_clicked), + (home_clicked), (do_iconview): + Add a simple file browser based on the icon view. + + * gtk/gtk.h: + Add gtk/gtkiconview.h + + * gtk/gtkiconview.c: (gtk_icon_view_layout), + (gtk_icon_view_item_new), (gtk_icon_view_item_activated): + Fix a few bugs discovered while writing the demo. + 2004-07-04 Anders Carlsson * gtk/Makefile.am: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 68a94576a3..e255059074 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,20 @@ +2004-07-04 Anders Carlsson + + * demos/gtk-demo/Makefile.am: + * demos/gtk-demo/gnome-fs-directory.png: + * demos/gtk-demo/gnome-fs-regular.png: + * demos/gtk-demo/iconview.c: (load_pixbufs), (fill_store), + (sort_func), (create_store), (item_activated), (up_clicked), + (home_clicked), (do_iconview): + Add a simple file browser based on the icon view. + + * gtk/gtk.h: + Add gtk/gtkiconview.h + + * gtk/gtkiconview.c: (gtk_icon_view_layout), + (gtk_icon_view_item_new), (gtk_icon_view_item_activated): + Fix a few bugs discovered while writing the demo. + 2004-07-04 Anders Carlsson * gtk/Makefile.am: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 68a94576a3..e255059074 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,20 @@ +2004-07-04 Anders Carlsson + + * demos/gtk-demo/Makefile.am: + * demos/gtk-demo/gnome-fs-directory.png: + * demos/gtk-demo/gnome-fs-regular.png: + * demos/gtk-demo/iconview.c: (load_pixbufs), (fill_store), + (sort_func), (create_store), (item_activated), (up_clicked), + (home_clicked), (do_iconview): + Add a simple file browser based on the icon view. + + * gtk/gtk.h: + Add gtk/gtkiconview.h + + * gtk/gtkiconview.c: (gtk_icon_view_layout), + (gtk_icon_view_item_new), (gtk_icon_view_item_activated): + Fix a few bugs discovered while writing the demo. + 2004-07-04 Anders Carlsson * gtk/Makefile.am: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 68a94576a3..e255059074 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,20 @@ +2004-07-04 Anders Carlsson + + * demos/gtk-demo/Makefile.am: + * demos/gtk-demo/gnome-fs-directory.png: + * demos/gtk-demo/gnome-fs-regular.png: + * demos/gtk-demo/iconview.c: (load_pixbufs), (fill_store), + (sort_func), (create_store), (item_activated), (up_clicked), + (home_clicked), (do_iconview): + Add a simple file browser based on the icon view. + + * gtk/gtk.h: + Add gtk/gtkiconview.h + + * gtk/gtkiconview.c: (gtk_icon_view_layout), + (gtk_icon_view_item_new), (gtk_icon_view_item_activated): + Fix a few bugs discovered while writing the demo. + 2004-07-04 Anders Carlsson * gtk/Makefile.am: diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index c139feb3da..7557fb91bb 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -15,6 +15,7 @@ demos = \ entry_completion.c \ expander.c \ hypertext.c \ + iconview.c \ images.c \ list_store.c \ menus.c \ @@ -72,12 +73,14 @@ IMAGEFILES= alphatest.png \ floppybuddy.gif \ gnome-applets.png \ gnome-calendar.png \ + gnome-fs-directory.png \ + gnome-fs-regular.png \ gnome-foot.png \ gnome-gimp.png \ gnome-gmush.png \ gnome-gsame.png \ gnu-keys.png \ - gtk-logo-rgb.gif + gtk-logo-rgb.gif democode_DATA = $(demos) $(IMAGEFILES) diff --git a/demos/gtk-demo/gnome-fs-directory.png b/demos/gtk-demo/gnome-fs-directory.png new file mode 100644 index 0000000000000000000000000000000000000000..05921a668995249083f4b0be9164e666066e8da2 GIT binary patch literal 2044 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 literal 0 HcmV?d00001 diff --git a/demos/gtk-demo/iconview.c b/demos/gtk-demo/iconview.c new file mode 100644 index 0000000000..56e74da745 --- /dev/null +++ b/demos/gtk-demo/iconview.c @@ -0,0 +1,358 @@ +/* Icon View + * + * The GtkIconView widget is used to display and manipulate icons. It + * uses a GtkTreeModel for data storage, so the list store example + * might be helpful. + */ + +#include +#include +#include +#include "demo-common.h" + +static GtkWidget *window = NULL; + +#define FOLDER_NAME "gnome-fs-directory.png" +#define FILE_NAME "gnome-fs-regular.png" + +enum +{ + COL_PATH, + COL_DISPLAY_NAME, + COL_PIXBUF, + COL_IS_DIRECTORY, + NUM_COLS +}; + + +static GdkPixbuf *file_pixbuf, *folder_pixbuf; +gchar *parent; +GtkToolItem *up_button; + +/* Loads the images for the demo and returns whether the operation succeeded */ +static gboolean +load_pixbufs (GError **error) +{ + char *filename; + + if (file_pixbuf) + return TRUE; /* already loaded earlier */ + + /* demo_find_file() looks in the the current directory first, + * so you can run gtk-demo without installing GTK, then looks + * in the location where the file is installed. + */ + filename = demo_find_file (FILE_NAME, error); + if (!filename) + return FALSE; /* note that "error" was filled in and returned */ + + file_pixbuf = gdk_pixbuf_new_from_file (filename, error); + g_free (filename); + + if (!file_pixbuf) + return FALSE; /* Note that "error" was filled with a GError */ + + filename = demo_find_file (FOLDER_NAME, error); + if (!filename) + return FALSE; /* note that "error" was filled in and returned */ + + folder_pixbuf = gdk_pixbuf_new_from_file (filename, error); + g_free (filename); + + return TRUE; +} + +static void +fill_store (GtkListStore *store) +{ + GDir *dir; + const gchar *name; + GtkTreeIter iter; + + /* First clear the store */ + gtk_list_store_clear (store); + + /* Now go through the directory and extract all the file + * information */ + dir = g_dir_open (parent, 0, NULL); + if (!dir) + return; + + name = g_dir_read_name (dir); + while (name != NULL) + { + gchar *path, *display_name; + gboolean is_dir; + + /* We ignore hidden files that start with a '.' */ + if (name[0] != '.') + { + path = g_build_filename (parent, name, NULL); + + is_dir = g_file_test (path, G_FILE_TEST_IS_DIR); + + display_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COL_PATH, path, + COL_DISPLAY_NAME, display_name, + COL_IS_DIRECTORY, is_dir, + COL_PIXBUF, is_dir ? folder_pixbuf : file_pixbuf, + -1); + g_free (path); + g_free (display_name); + } + + name = g_dir_read_name (dir); + } +} + +static gint +sort_func (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer user_data) +{ + gboolean is_dir_a, is_dir_b; + gchar *name_a, *name_b; + int ret; + + /* We need this function because we want to sort + * folders before files. + */ + + + gtk_tree_model_get (model, a, + COL_IS_DIRECTORY, &is_dir_a, + COL_DISPLAY_NAME, &name_a, + -1); + + gtk_tree_model_get (model, b, + COL_IS_DIRECTORY, &is_dir_b, + COL_DISPLAY_NAME, &name_b, + -1); + + if (!is_dir_a && is_dir_b) + ret = 1; + else if (is_dir_a && !is_dir_b) + ret = -1; + else + { + ret = g_utf8_collate (name_a, name_b); + } + + g_free (name_a); + g_free (name_b); + + return ret; +} + +GtkListStore * +create_store (void) +{ + GtkListStore *store; + + store = gtk_list_store_new (NUM_COLS, + G_TYPE_STRING, + G_TYPE_STRING, + GDK_TYPE_PIXBUF, + G_TYPE_BOOLEAN); + + /* Set sort column and function */ + gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store), + sort_func, + NULL, NULL); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, + GTK_SORT_ASCENDING); + + return store; +} + +static void +item_activated (GtkIconView *icon_view, + GtkTreePath *tree_path, + gpointer user_data) +{ + GtkListStore *store; + gchar *path; + GtkTreeIter iter; + gboolean is_dir; + + store = GTK_LIST_STORE (user_data); + + gtk_tree_model_get_iter (GTK_TREE_MODEL (store), + &iter, tree_path); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + COL_PATH, &path, + COL_IS_DIRECTORY, &is_dir, + -1); + + if (!is_dir) + { + g_free (path); + return; + } + + /* Replace parent with path and re-fill the model*/ + g_free (parent); + parent = path; + + fill_store (store); + + /* Sensitize the up button */ + gtk_widget_set_sensitive (GTK_WIDGET (up_button), TRUE); +} + +static void +up_clicked (GtkToolItem *item, + gpointer user_data) +{ + GtkListStore *store; + gchar *dir_name; + + store = GTK_LIST_STORE (user_data); + + dir_name = g_path_get_dirname (parent); + g_free (parent); + + parent = dir_name; + + fill_store (store); + + /* Maybe de-sensitize the up button */ + gtk_widget_set_sensitive (GTK_WIDGET (up_button), + strcmp (parent, "/") != 0); +} + +static void +home_clicked (GtkToolItem *item, + gpointer user_data) +{ + GtkListStore *store; + + store = GTK_LIST_STORE (user_data); + + g_free (parent); + parent = g_strdup (g_get_home_dir ()); + + fill_store (store); + + /* Sensitize the up button */ + gtk_widget_set_sensitive (GTK_WIDGET (up_button), + TRUE); +} + +GtkWidget * +do_iconview (GtkWidget *do_widget) +{ + if (!window) + { + GError *error; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (window), 650, 400); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (do_widget)); + gtk_window_set_title (GTK_WINDOW (window), "GtkIconView demo"); + + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_widget_destroyed), &window); + + error = NULL; + if (!load_pixbufs (&error)) + { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "Failed to load an image: %s", + error->message); + + g_error_free (error); + + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), NULL); + + gtk_widget_show (dialog); + } + else + { + GtkWidget *sw; + GtkWidget *icon_view; + GtkListStore *store; + GtkWidget *vbox; + GtkWidget *tool_bar; + GtkToolItem *home_button; + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + + tool_bar = gtk_toolbar_new (); + gtk_box_pack_start (GTK_BOX (vbox), tool_bar, FALSE, FALSE, 0); + + up_button = gtk_tool_button_new_from_stock (GTK_STOCK_GO_UP); + gtk_tool_item_set_is_important (up_button, TRUE); + gtk_widget_set_sensitive (GTK_WIDGET (up_button), FALSE); + gtk_toolbar_insert (GTK_TOOLBAR (tool_bar), up_button, -1); + + home_button = gtk_tool_button_new_from_stock (GTK_STOCK_HOME); + gtk_tool_item_set_is_important (home_button, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (tool_bar), home_button, -1); + + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), + GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); + + /* Create the store and fill it with the contents of '/' */ + parent = g_strdup ("/"); + store = create_store (); + fill_store (store); + + icon_view = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store)); + g_object_unref (store); + + /* Connect to the "clicked" signal of the "Up" tool button */ + g_signal_connect (up_button, "clicked", + G_CALLBACK (up_clicked), store); + + /* Connect to the "clicked" signal of the "Home" tool button */ + g_signal_connect (home_button, "clicked", + G_CALLBACK (home_clicked), store); + + /* We now set which model columns that correspont to the text + * and pixbuf of each item + */ + gtk_icon_view_set_text_column (GTK_ICON_VIEW (icon_view), COL_DISPLAY_NAME); + gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (icon_view), COL_PIXBUF); + + /* Connect to the "item_activated" signal */ + g_signal_connect (icon_view, "item_activated", + G_CALLBACK (item_activated), store); + gtk_container_add (GTK_CONTAINER (sw), icon_view); + + gtk_widget_grab_focus (icon_view); + } + } + + if (!GTK_WIDGET_VISIBLE (window)) + gtk_widget_show_all (window); + else + { + gtk_widget_destroy (window); + window = NULL; + } + + return window; +} + diff --git a/gtk/gtk.h b/gtk/gtk.h index b848252014..5b7dcfb3e1 100644 --- a/gtk/gtk.h +++ b/gtk/gtk.h @@ -92,6 +92,7 @@ #include #include #include +#include #include #include #include diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c index 8ac72d48bf..a7b83b052c 100644 --- a/gtk/gtkiconview.c +++ b/gtk/gtkiconview.c @@ -47,8 +47,6 @@ typedef struct { - gint ref_count; - GtkTreeIter iter; int index; @@ -1476,7 +1474,10 @@ gtk_icon_view_layout (GtkIconView *icon_view) GList *icons; GtkWidget *widget; gint row; - + + if (!VALID_MODEL_AND_COLUMNS (icon_view)) + return; + widget = GTK_WIDGET (icon_view); icons = icon_view->priv->items; @@ -1824,7 +1825,6 @@ gtk_icon_view_item_new (void) item = g_new0 (GtkIconViewItem, 1); - item->ref_count = 1; item->width = -1; item->height = -1; @@ -3146,6 +3146,8 @@ gtk_icon_view_get_selected_items (GtkIconView *icon_view) * * Selects all the icons. @icon_view must has its selection mode set * to #GTK_SELECTION_MULTIPLE. + * + * Since: 2.6 **/ void gtk_icon_view_select_all (GtkIconView *icon_view) @@ -3179,6 +3181,8 @@ gtk_icon_view_select_all (GtkIconView *icon_view) * @icon_view: A #GtkIconView. * * Unselects all the icons. + * + * Since: 2.6 **/ void gtk_icon_view_unselect_all (GtkIconView *icon_view) @@ -3202,6 +3206,8 @@ gtk_icon_view_unselect_all (GtkIconView *icon_view) * selected. If @icon does not point to a valid location, %FALSE is returned. * * Return value: %TRUE if @path is selected. + * + * Since: 2.6 **/ gboolean gtk_icon_view_path_is_selected (GtkIconView *icon_view, @@ -3228,10 +3234,15 @@ gtk_icon_view_path_is_selected (GtkIconView *icon_view, * @path: The #GtkTreePath to be activated * * Activates the item determined by @path. + * + * Since: 2.6 **/ void gtk_icon_view_item_activated (GtkIconView *icon_view, GtkTreePath *path) { + g_return_if_fail (GTK_IS_ICON_VIEW (icon_view)); + g_return_if_fail (path != NULL); + g_signal_emit (G_OBJECT (icon_view), icon_view_signals[ITEM_ACTIVATED], 0, path); } -- 2.30.2